package mail;

import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailJavaSender {

    //cria as propriedades necessárias para o envio de email
    public void senderMail(final MailJava mail) throws
            UnsupportedEncodingException, MessagingException {
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mail.getSmtpHostMail());
        props.setProperty("mail.smtp.auth", mail.getSmtpAuth());
        props.setProperty("mail.smtp.starttls.enable", mail.getSmtpStarttls());
        props.setProperty("mail.smtp.port", mail.getSmtpPortMail());
        props.setProperty("mail.mime.charset", mail.getCharsetMail());
        //classe anonima que realiza a autenticação

        //do usuario no servidor de email.

        Authenticator auth = new Authenticator() {

            public PasswordAuthentication getPasswordAuthentication() {

                return new PasswordAuthentication(
                        mail.getUserMail(), mail.getPassMail());

            }
        };



        // Cria a sessao passando as propriedades e a autenticação

        Session session = Session.getDefaultInstance(props, auth);

        // Gera um log no console referente ao processo de envio

        session.setDebug(true);



        //cria a mensagem setando o remetente e seus destinatários

        Message msg = new MimeMessage(session);

        //aqui seta o remetente

        msg.setFrom(new InternetAddress(
                mail.getUserMail(), mail.getFromNameMail()));

        boolean first = true;

        for (Map.Entry<String, String> map : mail.getToMailsUsers().entrySet()) {

            if (first) {

                //setamos o 1° destinatario
                msg.addRecipient(Message.RecipientType.TO,
                        new InternetAddress(map.getKey(), map.getValue()));

                first = false;

            } else {

                //setamos os demais destinatarios

                msg.addRecipient(Message.RecipientType.CC,
                        new InternetAddress(map.getKey(), map.getValue()));

            }

        }



        // Adiciona um Assunto a Mensagem

        msg.setSubject(mail.getSubjectMail());



        // Cria o objeto que recebe o texto do corpo do email

        MimeBodyPart textPart = new MimeBodyPart();

        textPart.setContent(mail.getBodyMail(), mail.getTypeTextMail());



        // Monta a mensagem SMTP  inserindo o conteudo, texto e anexos

        Multipart mps = new MimeMultipart();

        for (int index = 0; index < mail.getFileMails().size(); index++) {



            // Cria um novo objeto para cada arquivo, e anexa o arquivo

            MimeBodyPart attachFilePart = new MimeBodyPart();

            FileDataSource fds = new FileDataSource(
                    mail.getFileMails().get(index));

            attachFilePart.setDataHandler(new DataHandler(fds));

            attachFilePart.setFileName(fds.getName());


            //adiciona os anexos da mensagem

            mps.addBodyPart(attachFilePart, index);



        }



        //adiciona o corpo texto da mensagem

        mps.addBodyPart(textPart);



        //adiciona a mensagem o conteúdo texto e anexo

        msg.setContent(mps);



        // Envia a Mensagem

        Transport.send(msg);

    }
}
